; 1 . ORIGINAL TINY BASIC INTERMEDIATE INTERPRETER ; 2 . ; 3 . EXECUTIVE INITIALIZATION ; 4 . ; 5 :STRT PC ":Q^ " COLON, X-ON 243A91; ; 6 GL 27; 7 SB 10; 8 BE L0 BRANCH IF NOT EMPTY E1; 9 BR STRT TRY AGAIN IF NULL LINE 59; 10 :L0 BN STMT TEST FOR LINE NUMBER C5; 11 IL IF SO, INSERT INTO PROGRAM 2A; 12 BR STRT GO GET NEXT 56; 13 :XEC SB SAVE POINTERS FOR RUN WITH 10; 14 RB CONCATENATED INPUT 11; 15 XQ 2C; 16 . ; 17 . STATEMENT EXECUTOR ; 18 . ; 19 :STMT BC GOTO "LET 8B4C45D4; ; 20 BV * MUST BE A VARIABLE NAME A0; 21 BC * "= 80BD; 22 :LET JS EXPR GO GET EXPRESSION 30BC; 23 BE * IF STATEMENT END, E0; 24 SV STORE RESULT 13; 25 NX 1D; 26 . ; 27 :GOTO BC PRNT "GO 9447CF; ; 28 BC GOSB "TO 8854CF; ; 29 JS EXPR GET LINE NUMBER 30BC; 30 BE * E0; 31 SB (DO THIS FOR STARTING) 10; 32 RB 11; 33 GO GO THERE 16; 34 . ; 35 :GOSB BC * "SUB " NO OTHER WORD BEGINS "GO... 805355C2; ; 36 JS EXPR 30BC; 37 BE * E0; 38 GS 14; 39 GO 16; 40 . ; 41 :PRNT BC SKIP "PR 9050D2; ; 42 BC P0 "INT " OPTIONALLY OMIT "INT 83494ED4; ; 43 :P0 BE P3 E5; 44 BR P6 IF DONE, GO TO END 71; 45 :P1 BC P4 "; 88BB; 46 :P2 BE P3 E1; 47 NX NO CRLF IF ENDED BY ; OR , 1D; 48 :P3 BC P7 ' "' 8FA2; 49 PQ QUOTE MARKS STRING 21; 50 BR P1 GO CHECK DELIMITER 58; 51 :SKIP BR IF (ON THE WAY THRU) 6F; 52 :P4 BC P5 ", 83AC; 53 PT COMMA SPACING 22; 54 BR P2 55; 55 :P5 BC P6 ": 83BA; 56 PC "S^ " OUTPUT X-OFF 2493; 57 :P6 BE * E0; 58 NL THEN CRLF 23; 59 NX 1D; 60 :P7 JS EXPR TRY FOR AN EXPRESSION 30BC; 61 PN 20; 62 BR P1 48; 63 . ; 64 :IF BC INPT "IF 9149C6; ; 65 JS EXPR 30BC; 66 JS RELO 3134; 67 JS EXPR 30BC; 68 BC I1 "THEN " OPTIONAL NOISEWORD 84544845CE; ; 69 :I1 CP COMPARE SKIPS NEXT IF TRUE 1C; 70 NX FALSE. 1D; 71 J STMT TRUE. GO PROCESS STATEMENT 380D; 72 . ; 73 :INPT BC RETN "INPUT 9A494E5055D4; ; 74 :I2 BV * GET VARIABLE A0; 75 SB SWAP POINTERS 10; 76 BE I4 E7; 77 :I3 PC "? Q^ " LINE IS EMPTY; TYPE PROMPT 243F2091; ; 78 GL READ INPUT LINE 27; 79 BE I4 DID ANYTHING COME? E1; 80 BR I3 NO, TRY AGAIN 59; 81 :I4 BC I5 ", " OPTIONAL COMMA 81AC; 82 :I5 JS EXPR READ A NUMBER 30BC; 83 SV STORE INTO VARIABLE 13; 84 RB SWAP BACK 11; 85 BC I6 ", " ANOTHER? 82AC; 86 BR I2 YES IF COMMA 4D; 87 :I6 BE * OTHERWISE QUIT E0; 88 NX 1D; 89 . ; 90 :RETN BC END "RETURN 895245545552CE; ; 91 BE * E0; 92 RS RECOVER SAVED LINE 15; 93 NX 1D; 94 . ; 95 :END BC LIST "END 85454EC4; ; 96 BE * E0; 97 WS 2D; 98 . ; 99 :LIST BC RUN "LIST 984C4953D4; ; 100 BE L2 EC; 101 :L1 PC "@^@^@^@^J^@^ " PUNCH LEADER 24000000000A80; ; 102 LS LIST 1F; 103 PC "S^ " PUNCH X-OFF 2493; 104 NL 23; 105 NX 1D; 106 :L2 JS EXPR GET A LINE NUMBER 30BC; 107 BE L3 E1; 108 BR L1 50; 109 :L3 BC * ", " SEPARATED BY COMMAS 80AC; 110 BR L2 59; 111 . ; 112 :RUN BC CLER "RUN 855255CE; ; 113 J XEC 380A; 114 . ; 115 :CLER BC REM "CLEAR 86434C4541D2; ; 116 MT 2B; 117 . ; 118 :REM BC DFLT "REM 845245CD; ; 119 NX 1D; 120 . ; 121 :DFLT BV * NO KEYWORD... A0; 122 BC * "= " TRY FOR LET 80BD; 123 J LET IT'S A GOOD BET. 3814; 124 . ; 125 . SUBROUTINES ; 126 . ; 127 :EXPR BC E0 "- " TRY FOR UNARY MINUS 85AD; 128 JS TERM AHA 30D3; 129 NE 17; 130 BR E1 64; 131 :E0 BC E4 "+ " IGNORE UNARY PLUS 81AB; 132 :E4 JS TERM 30D3; 133 :E1 BC E2 "+ " TERMS SEPARATED BY PLUS 85AB; 134 JS TERM 30D3; 135 AD 18; 136 BR E1 5A; 137 :E2 BC E3 "- " TERMS SEPARATED BY MINUS 85AD; 138 JS TERM 30D3; 139 SU 19; 140 BR E1 54; 141 :E3 RT 2F; 142 . ; 143 :TERM JS FACT 30E2; 144 :T0 BC T1 "* " FACTORS SEPARATED BY TIMES 85AA; 145 JS FACT 30E2; 146 MP 1A; 147 BR T0 5A; 148 :T1 BC T2 "/ " FACTORS SEPARATED BY DIVIDE 85AF; 149 JS FACT 30E2; 150 DV 1B; 151 BR T0 54; 152 :T2 RT 2F; 153 . ; 154 :FACT BC F0 "RND " *RND FUNCTION* 97524EC4; ; 155 LN 257*128 STACK POINTER FOR STORE 0A; 8080; 156 FV THEN GET RNDM 12; 157 LN 2345 R:=R*2345+6789 0A; 0929; 158 MP 1A; 159 LN 6789 0A; 1A85; 160 AD 18; 161 SV 13; 162 LB 128 GET IT AGAIN 0980; 163 FV 12; 164 DS 0B; 165 JS FUNC GET ARGUMENT 3130; 166 BR F1 61; 167 :F0 BR F2 (SKIPPING) 73; 168 :F1 DS 0B; 169 SX 2 PUSH TOP INTO STACK 02; 170 SX 4 04; 171 SX 2 02; 172 SX 3 03; 173 SX 5 05; 174 SX 3 03; 175 DV PERFORM MOD FUNCTION 1B; 176 MP 1A; 177 SU 19; 178 DS PERFORM ABS FUNCTION 0B; 179 LB 6 0906; 180 LN 0 0A; 0000; 181 CP (SKIP IF + OR 0) 1C; 182 NE 17; 183 RT 2F; 184 :F2 BC F3 "USR " *USR FUNCTION* 8F5553D2; ; 185 BC * "( " 3 ARGUMENTS POSSIBLE 80A8; 186 JS EXPR ONE REQUIRED 30BC; 187 JS ARG 312A; 188 JS ARG 312A; 189 BC * ") 80A9; 190 US GO DO IT 2E; 191 RT 2F; 192 :F3 BV F4 VARIABLE? A2; 193 FV YES. GET IT 12; 194 RT 2F; 195 :F4 BN F5 NUMBER? C1; 196 RT GOT IT. 2F; 197 :F5 BC * "( " OTHERWISE MUST BE (EXPR) 80A8; 198 :F6 JS EXPR 30BC; 199 BC * ") 80A9; 200 RT 2F; 201 . ; 202 :ARG BC A0 ", " COMMA? 83AC; 203 J EXPR YES, GET EXPRESSION 38BC; 204 :A0 DS NO, DUPLICATE STACK TOP 0B; 205 RT 2F; 206 . ; 207 :FUNC BC * "( 80A8; 208 BR F6 52; 209 RT 2F; 210 . ; 211 :RELO BC R0 "= " CONVERT RELATION OPERATORS 84BD; 212 LB 2 TO CODE BYTE ON STACK 0902; 213 RT = 2F; 214 :R0 BC R4 "< 8EBC; 215 BC R1 "= 84BD; 216 LB 3 <= 0903; 217 RT 2F; 218 :R1 BC R3 "> 84BE; 219 LB 5 <> 0905; 220 RT 2F; 221 :R3 LB 1 < 0901; 222 RT 2F; 223 :R4 BC * "> 80BE; 224 BC R5 "= 84BD; 225 LB 6 >= 0906; 226 RT 2F; 227 :R5 BC R6 "< 84BC; 228 LB 5 >< 0905; 229 RT 2F; 230 :R6 LB 4 > 0904; 231 RT 2F; 232 . ; 0000